package cn.tedu.justone.pack02;

/**
 * ZZ：JustOne
 * VX：Andylau2020smile
 * DY：JustOne2018
 * ZT：《》
 */
public class Demo10_3_案例测试synchronized遇到异常 {
    public static void main(String[] args) throws InterruptedException {

        //案例测试synchronized遇到异常
        //案例测试synchronized遇到异常
        //案例测试synchronized遇到异常
        //1,测试思路是让两条线程执行上了锁的foo()方法，其中一条线程A获得锁对象后就会开始执行，
        //  另一条线程加入该锁的等待队伍中。
        //2,如果线程A顺利执行完代码，就会释放锁对象。
        //3,如果线程A执行过程中遇到了异常，也会释放锁对象。

        //结论：当线程进入synchronized代码后，无论是顺利执行完还是遇到了异常，都会释放锁对象。

        Thread t1 = new Thread("女生"){
            @Override
            public void run() {
                foo();
            }
        };

        Thread t2 = new Thread("男生"){
            @Override
            public void run() {
                foo();
            }
        };

        t1.start();
        t2.start();

    }

    public synchronized static void foo(){
        for (int i = 0; i < 10; i++) {
            String name = Thread.currentThread().getName();
            System.out.println(name + ":" + i);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //持有锁的过程中上出现了异常，就会释放锁对象，
            //别的线程会获得锁
            if(i==5){
                throw new RuntimeException();
            }
        }
    }


}

